#include <stdio.h>
#include <stdlib.h>
#include <string.h>



#include "global.h"
#include "constantes.h"
#include "listas.h"


void addToList(gl *list, void *data)
{
    if (list->data == NULL)
    {
        list->data = data;
        list->sgt = NULL;
    }
    else
    {
        gl *aux = list;
        while (aux->sgt!=NULL)
        {
            aux = aux->sgt;
        }
        gl *newNode = (gl*) malloc(sizeof(gl));
        newNode->data = data;
        newNode->sgt = NULL;
        aux->sgt = newNode;
    }
}

void addListToList(gl *list, gl *listToAdd)
{
    int i = 0;
    gl *q = listToAdd;
    for(i=0;q!=NULL;i++)
    {
      addToList(list,q->data);
      q = q->sgt;
    }
}

void deleteOfList(gl *list, void *data)
{
    gl *aux = list;
    if (aux!=NULL)
    {
        if (aux->data!=data)
        {
            while (aux->sgt!=NULL && aux->sgt->data!=data)
            {
                aux = aux->sgt;
            }
            if (aux->sgt != NULL)
            {
                gl *dispose;
                dispose = aux->sgt;
                aux->sgt = aux->sgt->sgt;
                free(dispose);
            }
        }
        else
            *list = *aux->sgt;
    }
}

void deleteList(gl *list, gl *listToDelete)
{
    int i = 0;
    gl *q = listToDelete;
    for(i=0;q!=NULL;i++)
    {
      gl *aux = q->sgt;
      deleteOfList(list,q->data);
      q = aux;
    }
}

void deleteOfListByPosition(gl *list, int pos)
{
    gl *aux = list;
    gl *ant = list;
    int i = 0;
    if (aux!=NULL)
    {
        for (i = 0;aux != NULL && i < pos; i++)
        {
            aux = aux->sgt;
            if (i!=0)
                ant = ant->sgt;
        }
        if (i!=0)
        {
            if (aux!=NULL)
            {
                gl *dispose;
                dispose = aux;
                ant->sgt = aux->sgt;
                free(dispose);
            }
        }
        else
            *list = *aux->sgt;

    }
}


void insertarOrdenado(gl *list,void *data){

   gl*  ptrAnterior;
   gl*  ptrActual;

   gl *ptrNuevo = (gl*) malloc(sizeof(gl));
   ptrNuevo->data = data;
   ptrNuevo->sgt = NULL;
   
   ptrAnterior=NULL;
   ptrActual=list;
    
   while((ptrActual!=NULL)&&(data > ptrActual->data)){
      
      ptrAnterior=ptrActual;
      ptrActual=ptrActual->sgt;
      
   } /*Fin de while*/
    
   if (ptrAnterior==NULL){                                        /*Inserta elemento al ppio de la lista*/
      ptrNuevo->sgt=list;
      list=ptrNuevo;
      
   }/*Fin de if*/
   else{
      ptrAnterior->sgt=ptrNuevo;
      ptrNuevo->sgt=ptrActual;
   }/*Fin de else*/   
              

}/*Fin insertarOrdenado*/


int buscar(gl *ptrActual,void *data){

   int i=0;

   while((ptrActual!=NULL)&&(ptrActual->data!=data)){
      ptrActual=ptrActual->sgt;  
      i++;
   }/*Fin while*/
   
   if(ptrActual==NULL){
      i=-1;
   }
   
   return i; 

}

int longitud(gl  *ptrActual) {
	
	int n=0;
	
	while (ptrActual != NULL) {  
	    ++n;
	   ptrActual = ptrActual->sgt;
	}
	return n;

}



int	AgregarAColaDePedidosADisco(struct ListaIDdescriptors ** pnodo, struct ListaIDdescriptors ** ListaDeIDPedidos, struct ListaIDdescriptors ** ListaDeIDPedidos_Ult )
{
char sMsj[100];

if((*ListaDeIDPedidos) == NULL)
	{
	(*pnodo)->Ant = NULL;
	(*pnodo)->Sgt = NULL;

	(*ListaDeIDPedidos) = (*pnodo);
	(*ListaDeIDPedidos_Ult) = (*pnodo);
	
	}	

else
	{
	(*pnodo)->Ant = NULL;
	(*pnodo)->Sgt = (*ListaDeIDPedidos);

	(*ListaDeIDPedidos)->Ant = (*pnodo);

	(*ListaDeIDPedidos) = (*pnodo);
	
	}

/*
sprintf(sMsj, "%i Agregado a la Lista ",(*pnodo)->iIdentificadorQP);
ArmarLog( 300 , 1 , sMsj );
*/

}

int AgregarACola_Put(struct Pedido_PutSectores ** pnodo) /* agrega el nodo a la lista de pedidos ListaPedidos_Put */
{

char sMsj[100];

if(ListaPedidos_Put == NULL)
	{
	(*pnodo)->Ant = NULL;
	(*pnodo)->Sgt = NULL;

	ListaPedidos_Put = (*pnodo);
	ListaPedidos_Put_Ult = (*pnodo);
	
	}	

else
	{
	(*pnodo)->Ant = NULL;
	(*pnodo)->Sgt = ListaPedidos_Put;

	ListaPedidos_Put->Ant = (*pnodo);

	ListaPedidos_Put = (*pnodo);
	
	}

/*
sprintf(sMsj, "%i Agregado a la Lista ",(*pnodo)->iIdentificadorQP);
ArmarLog( 300 , 1 , sMsj );
*/

}



int agregarAListaDeDiscos(struct DiscoConocido ** pnodo)			/*Agrega el nodo a la lista ListaDiscos (enlazar) */
{

char sMsj[100];

if(ListaDiscos == NULL)
	{
   
	(*pnodo)->Ant = NULL;
	(*pnodo)->Sgt = NULL;

	ListaDiscos = (*pnodo);
	ListaDiscos_Ult = (*pnodo);
	
	}	

else
	{
	(*pnodo)->Ant = NULL;
	(*pnodo)->Sgt = ListaDiscos;

	ListaDiscos->Ant = (*pnodo);

	ListaDiscos = (*pnodo);
	
	}

/*
sprintf(sMsj, "%i Agregado a la Lista ",(*pnodo)->iIdentificadorQP);
ArmarLog( 300 , 1 , sMsj );
*/

}


int SacarPedidoDeLista(struct Pedido_PutSectores ** nodo)  /****SACA EL NODO DE LA LISTA ListaPedidos_Put (solo DESENLAZAR)****/	
{

char sMsj[200];

if(  ((*nodo)->Ant == NULL) && ((*nodo)->Sgt == NULL)  )
	{
	ListaPedidos_Put_Ult = NULL;
	ListaPedidos_Put = NULL;

	}
else if(  ((*nodo)->Ant == NULL) && ((*nodo)->Sgt != NULL)  )
	{
	ListaPedidos_Put = (*nodo)->Sgt;
	ListaPedidos_Put->Ant = NULL;			
	}

else if(  ((*nodo)->Ant != NULL) && ((*nodo)->Sgt == NULL)  )
	{

	ListaPedidos_Put_Ult = (*nodo)->Ant;
	ListaPedidos_Put_Ult->Sgt = NULL;					

	}
else if(  ((*nodo)->Ant != NULL) && ((*nodo)->Sgt != NULL)  )
	{
	(*nodo)->Ant->Sgt=(*nodo)->Sgt;
	(*nodo)->Sgt->Ant=(*nodo)->Ant;

	}


/*	sprintf(sMsj, "Retirado de la Lista ");
	ArmarLog( 300 , 1 , sMsj );*/

return 0;

}

int SacarNodoDescriptoresDeLista(struct ListaIDdescriptors ** nodo, struct ListaIDdescriptors ** ListaDeIDPedidos, struct ListaIDdescriptors ** ListaDeIDPedidos_Ult)
{

char sMsj[200];

if(  ((*nodo)->Ant == NULL) && ((*nodo)->Sgt == NULL)  )
	{
	(*ListaDeIDPedidos_Ult) = NULL;
	(*ListaDeIDPedidos) = NULL;

	}
else if(  ((*nodo)->Ant == NULL) && ((*nodo)->Sgt != NULL)  )
	{
	(*ListaDeIDPedidos) = (*nodo)->Sgt;
	(*ListaDeIDPedidos)->Ant = NULL;			
	}

else if(  ((*nodo)->Ant != NULL) && ((*nodo)->Sgt == NULL)  )
	{

	(*ListaDeIDPedidos_Ult) = (*nodo)->Ant;
	(*ListaDeIDPedidos_Ult)->Sgt = NULL;					

	}
else if(  ((*nodo)->Ant != NULL) && ((*nodo)->Sgt != NULL)  )
	{
	(*nodo)->Ant->Sgt=(*nodo)->Sgt;
	(*nodo)->Sgt->Ant=(*nodo)->Ant;

	}


/*	sprintf(sMsj, "Retirado de la Lista ");
	ArmarLog( 300 , 1 , sMsj );*/

return 0;

}



struct DiscoConocido * BuscarDiscoPorNombre(char * sNombreDiscoABuscar)		/* busca disco por sNombre, y devuelve el nodo, NULL si no lo encuentra*/
{

struct DiscoConocido * pNodo;
	
	
	pNodo = ListaDiscos;

	while(pNodo != NULL)
		{
		if(strcmp(pNodo->sNombre , sNombreDiscoABuscar) == 0)
			return pNodo;
		pNodo = pNodo->Sgt;
		}

return NULL;

}



struct DiscoConocido * BuscarDiscoPorSocketParaDA(int iSocket)		/* busca disco por sNombre, y devuelve el nodo, NULL si no lo encuentra*/
{

struct DiscoConocido * pNodo;
	
	
	pNodo = ListaDiscos;

	while(pNodo != NULL)
		{
		if(pNodo->iSocketHDAParaDA  == iSocket)
			return pNodo;
		pNodo = pNodo->Sgt;
		}

return NULL;

}



struct Pedido_PutSectores * BuscarDescriptorYDevolverNodoDePedidoPut(char * sIDdescriptor_dePedido)		/*busca un la lista ListaPedidos_Put el nodo con el sDescriptorID que sea igual a IDdescriptor_dePedido (sin sacar el nodo de la lista )*/
{

struct Pedido_PutSectores * pNodo;
	
	
	pNodo = ListaPedidos_Put;

	while(pNodo != NULL)
		{
		if(strcmp(pNodo->sDescriptorID_delPedido , sIDdescriptor_dePedido) == 0)
			return pNodo;
		pNodo = pNodo->Sgt;
		}

return NULL;

}

struct ListaIDdescriptors * BuscarDescriptorEnListaDeDisco(struct ListaIDdescriptors * ListaDeIDPedidos, char * sDescriptorIDABuscar, int Opcion)	

{
struct ListaIDdescriptors * pNodo;
	
	
	pNodo = ListaDeIDPedidos;

	while(pNodo != NULL)
		{
		if(Opcion == DEL_DA)
			{			
			if(strcmp(pNodo->sDescriptorID_delDA , sDescriptorIDABuscar) == 0)
				return pNodo;

			}
		/*
		else	//DEL_PEDIDO
			{

			if(strcmp(pNodo->sDescriptorID_delPedido , sDescriptorIDABuscar) == 0)
				return pNodo;
			}
		*/
		pNodo = pNodo->Sgt;
		}

return NULL;

}


struct DiscoConocido * BuscarDiscoListo()	
{

struct DiscoConocido * pNodo;
	
	
	pNodo = ListaDiscos;

	while(pNodo != NULL)
		{
		if(pNodo->Estado == LISTO)
			return pNodo;
		pNodo = pNodo->Sgt;
		}

return NULL;

}


int	CambiaPosicionDelNodo(struct DiscoConocido ** pnodoDisco)
{



if((ListaDiscos == NULL) || (ListaDiscos_Ult == NULL))
	return -1;


if((*pnodoDisco) != ListaDiscos_Ult )
	{
	if ((*pnodoDisco)->Ant != NULL)
		{
		(*pnodoDisco)->Ant->Sgt = (*pnodoDisco)->Sgt;
		(*pnodoDisco)->Sgt->Ant = (*pnodoDisco)->Ant;

		}
	else				/* pnodo es el primero de la lista */
		{
		(*pnodoDisco)->Sgt->Ant = NULL;
		ListaDiscos = (*pnodoDisco)->Sgt;
		}

	ListaDiscos_Ult->Sgt = (*pnodoDisco);
	(*pnodoDisco)->Ant = ListaDiscos_Ult;

	ListaDiscos_Ult = (*pnodoDisco);
	ListaDiscos_Ult->Sgt = NULL;

	}

return 0;
}




int	SacarDeLista_DA(struct DiscoConocido ** nodo)  /*solo desenalzar el nodo de la lista ListaDA , sin liberar*/
{


char sMsj[200];



if(  ((*nodo)->Ant == NULL) && ((*nodo)->Sgt == NULL)  )
	{
	ListaDiscos_Ult = NULL;
	ListaDiscos = NULL;

	}
else if(  ((*nodo)->Ant == NULL) && ((*nodo)->Sgt != NULL)  )
	{
	ListaDiscos = (*nodo)->Sgt;
	ListaDiscos->Ant = NULL;
	}

else if(  ((*nodo)->Ant != NULL) && ((*nodo)->Sgt == NULL)  )
	{

	ListaDiscos_Ult = (*nodo)->Ant;
	ListaDiscos_Ult->Sgt = NULL;

	}
else if(  ((*nodo)->Ant != NULL) && ((*nodo)->Sgt != NULL)  )
	{
	(*nodo)->Ant->Sgt=(*nodo)->Sgt;
	(*nodo)->Sgt->Ant=(*nodo)->Ant;

	}



return 0;


}








